package code11_util;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

import org.junit.Test;

public class Test05 {
	// 只有中文会容易出现乱码
	// 测试helloworld
	@Test
	public void t1(){
		String s= "测试a";// UTF-8
		// 使用默认字符集
		byte[] bytes = s.getBytes();
		System.out.println("encoding:"+System.getProperty("file.encoding"));
		
		try {
			// 编码, 字符集名不区分大小写, GBK == gbk
			byte[] arr = s.getBytes("GBK");
			// GBK 一个中文 对应 2 个字节; UTF-8 一个中文对应 3 个字节
			System.out.println("GBK:"+Arrays.toString(arr));
			
			// 解码, 必须要使用和 编码时相同的字符集
			String s1 = new String(arr);// 使用默认字符, 当前为 UTF-8
			System.out.println("s1:"+s1);// 解码错误, 中文乱码
			// 使用指定字符集解码
			String s2 = new String(arr, "GBK");
			System.out.println("s2:"+s2);
			
			// s1 乱码
			byte[] arr2 = s1.getBytes("UTF-8");// s1 已经乱码了, 并UTF-8能够解析中文, 那转换的结果就更错误了
			System.out.println("arr2:"+Arrays.toString(arr2));
			// 解码，失败
			System.out.println("newGBK:" + new String(arr2, "GBK"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
	@Test
	public void t2() {
		String s = "测试hello";// 当前文件编码 UTF-8
		try {
			// 编码(编码一致, 字节数组正确)
			byte[] bytes = s.getBytes("UTF-8");
			// 使用错误字符集,解码
			String s2 = new String(bytes, "GBK");// GBK
			// 乱码了
			System.out.println("s2:"+s2);
			// 乱码的解决方式：
			// 还原编码
			byte[] arr2 = s2.getBytes("GBK");// GBK
			System.out.println("arr2:"+Arrays.toString(arr2));
			// 使用正确的字符集，重新编码，得到的内容不再乱码
			String s3 = new String(arr2, "UTF-8");
			System.out.println("s3="+s3);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
	@Test
	public void t3() throws Exception {
		// 创建一个 空字符串 ""
		String s1 = new String();
		// 使用默认字符集编码 指定字节数组
		s1 = new String(new byte[]{97,98});
		System.out.println(s1);
		// 根据char数组创建字符串
		s1 = new String(new char[]{'a','b'});
		// 使用指定字符集编码 指定字节数组
		s1 = new String(new byte[]{97,98}, "UTF-8");
		// 使用默认字符集编码 指定字节数组中 指定位置开始的 length个字节 (编码部分字节)
		s1 = new String(new byte[]{97,98,99}, 1, 2);
		// 根据char数组 中从指定位置开始的 count个字符, 创建字符串
		s1 = new String(new char[]{'a','b','c','d'}, 2, 2);
		// 使用指定字符集编码 指定字节数组中 指定位置开始的 length个字节 (编码部分字节)
		s1 = new String(new byte[]{97,98,99}, 1, 2, "UTF-8");
	}
}
